from typing import Literal

from semanticscholar.AsyncSemanticScholar import (
    AsyncSemanticScholar as AsyncSemanticScholar,
)
from semanticscholar.Author import Author as Author
from semanticscholar.PaginatedResults import PaginatedResults as PaginatedResults
from semanticscholar.Paper import Paper as Paper

class SemanticScholar:
    def __init__(
        self, timeout: int = 30, api_key: str = None, api_url: str = None, debug: bool = False, retry: bool = True
    ) -> None: ...
    @property
    def timeout(self) -> int: ...
    @timeout.setter
    def timeout(self, timeout: int) -> None: ...
    @property
    def debug(self) -> bool: ...
    @debug.setter
    def debug(self, debug: bool) -> None: ...
    @property
    def retry(self) -> bool: ...
    @retry.setter
    def retry(self, retry: bool) -> None: ...
    def get_paper(self, paper_id: str, fields: list = None) -> Paper: ...
    def get_papers(
        self, paper_ids: list[str], fields: list = None, return_not_found: bool = False
    ) -> list[Paper] | tuple[list[Paper], list[str]]: ...
    def get_paper_authors(self, paper_id: str, fields: list = None, limit: int = 100) -> PaginatedResults: ...
    def get_paper_citations(self, paper_id: str, fields: list = None, limit: int = 100) -> PaginatedResults: ...
    def get_paper_references(self, paper_id: str, fields: list = None, limit: int = 100) -> PaginatedResults: ...
    def search_paper(
        self,
        query: str,
        year: str = None,
        publication_types: list = None,
        open_access_pdf: bool = None,
        venue: list = None,
        fields_of_study: list = None,
        fields: list = None,
        publication_date_or_year: str = None,
        min_citation_count: int = None,
        limit: int = 100,
        bulk: bool = False,
        sort: str = None,
        match_title: bool = False,
    ) -> PaginatedResults | Paper: ...
    def get_author(self, author_id: str, fields: list = None) -> Author: ...
    def get_authors(
        self, author_ids: list[str], fields: list = None, return_not_found: bool = False
    ) -> list[Author] | tuple[list[Author], list[str]]: ...
    def get_author_papers(self, author_id: str, fields: list = None, limit: int = 100) -> PaginatedResults: ...
    def search_author(self, query: str, fields: list = None, limit: int = 100) -> PaginatedResults: ...
    def get_recommended_papers(
        self, paper_id: str, fields: list = None, limit: int = 100, pool_from: Literal["recent", "all-cs"] = "recent"
    ) -> list[Paper]: ...
    def get_recommended_papers_from_lists(
        self, positive_paper_ids: list[str], negative_paper_ids: list[str] = None, fields: list = None, limit: int = 100
    ) -> list[Paper]: ...
